home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / programm.ing / m2posx10.zoo / m2posix.10 / test / forkexec.mpp next >
Encoding:
Text File  |  1993-08-26  |  3.6 KB  |  142 lines

  1. MODULE ForkExec;
  2. __IMP_SWITCHES__
  3. #ifdef HM2
  4. #ifdef __LONG_WHOLE__
  5. (*$!i+: Modul muss mit $i- uebersetzt werden! *)
  6. (*$!w+: Modul muss mit $w- uebersetzt werden! *)
  7. #else
  8. (*$!i-: Modul muss mit $i+ uebersetzt werden! *)
  9. (*$!w-: Modul muss mit $w+ uebersetzt werden! *)
  10. #endif
  11. #endif
  12. (* Test und Anwendungsbeispiel fuer Modul 'proc'.
  13.  *
  14.  * Das Programm 'SHOWCMD.TTP' muss sich in einem Verzeichnis befinden,
  15.  * das in der Environmentvariablen PATH steht.
  16.  *
  17.  * Programm laeuft nur unter MiNT, fuer "GEMDOS" 'Spawn' benutzen.
  18.  *
  19.  * hk, 20-Aug-93
  20.  *)
  21.  
  22. VAL_INTRINSIC
  23. CAST_IMPORT
  24.  
  25. FROM SYSTEM IMPORT
  26. (* PROC *) ADR;
  27.  
  28. FROM PORTAB IMPORT
  29. (* CONST*) NULL,
  30. (* TYPE *) UNSIGNEDWORD, SIGNEDWORD;
  31.  
  32. FROM types IMPORT
  33. (* TYPE *) StrPtr, StrArray, StrRange;
  34.  
  35. IMPORT e;
  36.  
  37. FROM proc IMPORT
  38. (* TYPE *) WaitVal, WaitOptions, WaitOption,
  39. (* PROC *) fork, execvp, waitpid, getpid, getppid, WEXITSTATUS, WIFSIGNALED,
  40.            WTERMSIG, WIFSTOPPED, WSTOPSIG;
  41.  
  42. FROM cstr IMPORT
  43. (* PROC *) strerror;
  44.  
  45. FROM InOut IMPORT
  46. (* PROC *) Read, Write, WriteInt, WriteCard, WriteString, WriteLn;
  47.  
  48. (*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*)
  49.  
  50. CONST
  51.   MaxArgv = 15;
  52.  
  53. TYPE
  54.   String = ARRAY [0..10] OF CHAR;
  55.  
  56. VAR
  57.   ret    : INTEGER;
  58.   pid    : INTEGER;
  59.   ch     : CHAR;
  60.   state  : WaitVal;
  61.   errstr : ARRAY [0..40] OF CHAR;
  62.  
  63.   idx    : StrRange;
  64.   prg    : String;
  65.   null   : String;
  66.   space  : String;
  67.   arg2   : String;
  68.   arg3   : String;
  69.   arg13  : String;
  70.   argv   : ARRAY [0..MaxArgv] OF StrPtr;
  71.  
  72.  
  73. BEGIN
  74.  pid := INT(fork());
  75.  
  76.  IF pid < 0 THEN (* parent *)
  77.    WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
  78.    WriteString("): ");
  79.    strerror(e.errno, errstr);
  80.    WriteString(errstr);
  81.    WriteLn;
  82.    ret := -1;
  83.  ELSIF pid > 0 THEN (* parent *)
  84.    WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
  85.    WriteString("): child(pid = "); WriteInt(pid, 0);
  86.    WriteString(") created");
  87.    WriteLn;
  88.    ret := INT(waitpid(pid, state, WaitOption{WUNTRACED}));
  89.    (* WUNTRACED: auch gestoppte Unterprozesse beruecksichtigen *)
  90.    WriteLn;
  91.    WriteString("-----------------------------------"); WriteLn;
  92.  ELSE (* child *)
  93.    prg   := "showcmd";
  94.    null  := "";
  95.    space := " ";
  96.    arg2  := "-2-";
  97.    arg3  := "-3-";
  98.    arg13 := "-13-";
  99.  
  100.    argv[0] := CAST(StrPtr,ADR(prg));
  101.    FOR idx := 1 TO MaxArgv DO
  102.      argv[idx] := CAST(StrPtr,ADR(null));
  103.    END;
  104.    argv[2]       := CAST(StrPtr,ADR(arg2));
  105.    argv[3]       := CAST(StrPtr,ADR(arg3));
  106.    argv[4]       := CAST(StrPtr,ADR(space));
  107.    argv[13]      := CAST(StrPtr,ADR(arg13));
  108.    argv[MaxArgv] := NULL;
  109.  
  110.    WriteString("CHILD(pid = "); WriteInt(VAL(INTEGER,getpid()), 0);
  111.    WriteString("), executing: "); WriteString(prg); WriteLn;
  112.    WriteString("-----------------------------------"); WriteLn;
  113.  
  114.    ret := execvp(prg, CAST(StrArray,ADR(argv)));
  115.  END;
  116.  
  117.  WriteLn;
  118.  WriteString("PARENT(pid = "); WriteInt(INT(getpid()), 0);
  119.  IF ret < 0 THEN
  120.    WriteString("): error: ");
  121.    strerror(e.errno, errstr);
  122.    WriteString(errstr);
  123.    WriteLn;
  124.  ELSE
  125.    WriteString("): child(pid = "); WriteInt(pid, 0);
  126.    WriteString(")-returncode = "); WriteInt(INT(CAST(SIGNEDWORD,state)), 0);
  127.    WriteLn;
  128.  
  129.    IF WIFSIGNALED(state) THEN
  130.      WriteString("Child terminated by Signal: "); WriteCard(WTERMSIG(state), 0);
  131.    ELSIF WIFSTOPPED(state) THEN
  132.      WriteString("Child stopped by Signal: "); WriteCard(WSTOPSIG(state), 0);
  133.    ELSE
  134.      WriteString("Child exit status: "); WriteInt(WEXITSTATUS(state), 0);
  135.    END;
  136.  END;
  137.  WriteLn;
  138.  Read(ch);
  139. END ForkExec.
  140.  
  141.  
  142.